package com.hsurosy.hsuchain.nft.file.config;

import com.hsurosy.hsuchain.nft.file.FileService;
import com.hsurosy.hsuchain.nft.file.MockFileServiceImpl;
import com.hsurosy.hsuchain.nft.file.OssServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

/**
 * OSS配置类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 4:25
 * @Description
 * @Version: v1.0.0
 */
@Configuration
@EnableConfigurationProperties(OssProperties.class)
public class OssConfiguration {

    /**
     * OSS属性配置类
     * 自动注入OssProperties，用于获取相关配置，如Bucket、EndPoint、AccessKey等。
     */
    @Autowired
    private OssProperties properties;

    /**
     * 配置OSS文件服务实现。
     * 当配置文件中 oss.enabled 设置为 true 且在 "default" 或 "prod" 环境下时，使用该服务。
     * 该方法会返回一个OssServiceImpl实例，并设置相关的OSS属性。
     *
     * @return FileService ossService实例
     */
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = OssProperties.PREFIX, value = "enabled", havingValue = "true")
    @Profile({"default", "prod"})
    public FileService ossService() {
        // 创建一个新的OssServiceImpl实例
        OssServiceImpl ossService = new OssServiceImpl();
        // 设置OSS服务的相关属性
        ossService.setBucket(properties.getBucket());
        ossService.setEndPoint(properties.getEndPoint());
        ossService.setAccessKey(properties.getAccessKey());
        ossService.setAccessSecret(properties.getAccessSecret());
        return ossService;
    }

    /**
     * 配置Mock文件服务实现。
     * 当环境为 "dev" 或 "test" 时，使用MockFileServiceImpl来替代实际的OSS服务。
     * 这样可以避免在开发或测试环境中调用真实的OSS服务。
     *
     * @return FileService mockFileService实例
     */
    @Bean
    @ConditionalOnMissingBean
    @Profile({"dev", "test"})
    public FileService mockFileService() {
        // 返回Mock文件服务的实现，用于开发和测试环境
        return new MockFileServiceImpl();
    }
}
